﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;

using Noris.Schedule.Support.Sql;
using Noris.Schedule.Support.Data;

namespace Noris.Schedule.Support.DataFace
{
    #region CLASS NorisUserCls : Třída odvozená z tabulky lcs.noris_user,       ZMĚNY !!! Reference (=Login)   a   Nazev (=OsobaNazev)
    /// <summary>
	/// NorisUserCls : Data z Master tabulky třídy 890: Přihlašovací údaje (NorisUserInstance), Subjektová
	/// Data načtena z tabulky lcs.noris_user
	/// </summary>
	public partial class NorisUserCls : RecordCls, IDbRecord
	{
		#region KONSTRUKTORY
		/// <summary>
		/// Implicitní konstruktor, zajistí číslování záznamů do jednotné Temporary řady
		/// </summary>
		public NorisUserCls()
			: base()
		{ }
		/// <summary>
		/// Konstruktor s načítáním dat z databáze
		/// </summary>
		/// <param name="recordNumber">Číslo záznamu, který je třeba načíst</param>
		public NorisUserCls(int recordNumber)
			: base(recordNumber)
		{ }
		/// <summary>
		/// Explicitní konstruktor, dovolí zvolit, zda se pro tento záznam bude generovat Temporary ID
		/// </summary>
		/// <param name="createTemporaryId">true pokud se pro záznam má vytvořit Temporary ID.
		/// Default (false) = nevytvoří se, bude mít RecordNumber = 0.</param>
		public NorisUserCls(bool createTemporaryId)
			: base(createTemporaryId)
		{ }
		#endregion
		#region PUBLIC OVERRIDE PROPERTY
		/// <summary>Číslo třídy</summary>
		public override int ClassNumber { get { return ClassNr ; } }
		/// <summary>Číslo třídy, konstanta</summary>
		public const int ClassNr = 890;
		/// <summary>Číslo záznamu = cislo_subjektu</summary>
		public override int RecordNumber { get { return base._cislo_subjektu; } }
		/// <summary>IDbRecord.RecordNumber : musí konkrétně implementovat set, protože DbLayer po uložení nového záznamu (kde RecordNumber == 0) do něj vloží přidělený klíč</summary>
		int IDbRecord.RecordNumber
		{
			get { return this.RecordNumber; }
			set { base._cislo_subjektu = value; }
		}
        public override string Reference { get { return this.Login; } protected set { } }
        public override string Nazev { get { return this.OsobaNazev; } protected set { } }
		#endregion
		#region PUBLIC DATA PROPERTY
		///<summary><para>Atribut: Login name</para><para>Db: lcs.noris_user.login (varchar (60) not null)</para></summary>
		public string Login { get { return _login; } }
		///<summary><para>Atribut: Heslo</para><para>Db: lcs.noris_user.heslo (varchar (256) null)</para></summary>
		public string Heslo { get { return _heslo; } }
		///<summary><para>Atribut: Datum posledního přihlášení</para><para>Db: lcs.noris_user.posledni_prihlaseni (smalldatetime null)</para></summary>
		public SqlDateTime PosledniPrihlaseni { get { return _posledni_prihlaseni; } }
		///<summary><para>Atribut: Datum předchozího přihlášení</para><para>Db: lcs.noris_user.predchozi_prihlaseni (smalldatetime null)</para></summary>
		public SqlDateTime PredchoziPrihlaseni { get { return _predchozi_prihlaseni; } }
		///<summary><para>Vztah 6822: Osoba (zprava: Přihlašovací údaje)</para><para>Db: lcs.noris_user.osoba (int not null)</para></summary>
		public int Osoba { get { return _osoba; } }
		///<summary><para>Atribut: DB Role [srv_role] {"uzivatele"=Uživatel; "admin"=Administrátor}</para><para>Db: lcs.noris_user.srv_role (varchar (10) null)</para></summary>
		public string SrvRole { get { return _srv_role; } }
		///<summary><para>Atribut: Viditelné heslo</para><para>Db: lcs.noris_user.viditelne_heslo (varchar (100) null)</para></summary>
		public string ViditelneHeslo { get { return _viditelne_heslo; } }
		///<summary><para>Atribut: Doména</para><para>Db: lcs.noris_user.domena (varchar (40) null)</para></summary>
		public string Domena { get { return _domena; } }
		///<summary><para>Atribut: Název SQL poolu</para><para>Db: lcs.noris_user.connection_pool_name (varchar (255) null)</para></summary>
		public string ConnectionPoolName { get { return _connection_pool_name; } }
		///<summary><para>Atribut: Typ licencovaného uživatele [licensed_user_type] {"C"=Běžný; "R"=Vyhrazený}</para><para>Db: lcs.noris_user.licensed_user_type (char (1) not null)</para></summary>
		public string LicensedUserType { get { return _licensed_user_type; } }
		///<summary>Atribut: Reference navázané osoby</summary>
		public string OsobaRefer { get { return _osoba_refer; } }
		///<summary>Atribut: Název navázané osoby</summary>
		public string OsobaNazev { get { return _osoba_nazev; } }
		#endregion
		#region PROTECTED DATA FIELDS
		#pragma warning disable 1591
		protected string _login;
		protected string _heslo;
		protected SqlDateTime _posledni_prihlaseni;
		protected SqlDateTime _predchozi_prihlaseni;
		protected int _osoba;
		protected string _srv_role;
		protected string _viditelne_heslo;
		protected string _domena;
		protected string _connection_pool_name;
		protected string _licensed_user_type;
		protected string _osoba_refer;
		protected string _osoba_nazev;
		#pragma warning restore 1591
		#endregion
		#region FILL FROM READER
		/// <summary>
		/// Virtuální metoda, která umožňuje potomkům provádět typovou a rychlou konverzi dat proudících z databáze přes DataReader 
		/// přímo do objektu této třídy, bez použití generické metody FieldInfo.SetValue (která je poněkud pomalá).
		/// Tato metoda v této třídě tedy má naplnit každou svoji instanční proměnnou (field) hodnotou z předaného SqlDataReaderu.
		/// Pro snadné načtení dat je předán objekt mapper, který nabízí svou generickou metodu FillDataIntoField«int»(string dbColumnName, SqlDataReader reader).
		/// Tato metoda vrátí načtená data (typovaná jako objekt).
		/// Čtení touto metodou je cca 6x rychlejší než čtení generickou metodou.
		/// Metoda má vracet true, pokud převzala všechna data. 
		/// Je nanejvýše účelné, aby tak provedla, protože pokud vrátí false, pak se po jejím skončení provede generické ukládání dat (což je 6x pomalejší).
		/// </summary>
		/// <param name="reader">Vstupní DataReader</param>
		/// <param name="map">Mapování dat z readeru na fields tohoto objektu</param>
		/// <returns>true = data byla převzata / false = data nepřevzata</returns>
		public override bool FillFromReader(SqlDataReader reader, FieldMapperLoad map)
		{
			base.FillFromReader(reader, map);
			_login = (string)map.FillDataIntoField<string>("login", reader);
			_heslo = (string)map.FillDataIntoField<string>("heslo", reader);
			_posledni_prihlaseni = (SqlDateTime)map.FillDataIntoField<SqlDateTime>("posledni_prihlaseni", reader);
			_predchozi_prihlaseni = (SqlDateTime)map.FillDataIntoField<SqlDateTime>("predchozi_prihlaseni", reader);
			_osoba = (int)map.FillDataIntoField<int>("osoba", reader);
			_srv_role = (string)map.FillDataIntoField<string>("srv_role", reader);
			_viditelne_heslo = (string)map.FillDataIntoField<string>("viditelne_heslo", reader);
			_domena = (string)map.FillDataIntoField<string>("domena", reader);
			_connection_pool_name = (string)map.FillDataIntoField<string>("connection_pool_name", reader);
			_licensed_user_type = (string)map.FillDataIntoField<string>("licensed_user_type", reader);
			_osoba_refer = (string)map.FillDataIntoField<string>("osoba_refer", reader);
			_osoba_nazev = (string)map.FillDataIntoField<string>("osoba_nazev", reader);
			return true;
		}
		#endregion
		#region STATIC GENERÁTORY SELECTU
		/// <summary>
		/// SQL SELECT pro načtení columnů, odpovídajících této struktuře. Pozor: neobsahuje filtr ani order.
		/// </summary>
		public static new string SqlSelect { get { return "SELECT lcs.noris_user.*, s.reference_subjektu as osoba_refer, s.nazev_subjektu as osoba_nazev FROM lcs.noris_user join lcs.subjekty s ON s.cislo_subjektu = lcs.noris_user.osoba"; } }
		/// <summary>
		/// Jméno sloupce, který obsahuje klíč záznamu, určeno pro filtry.
		/// </summary>
		public static new string SqlRecord { get { return "lcs.noris_user.cislo_subjektu"; } }
        /// <summary>
        /// Jméno sloupce, který obsahuje klíč osoby (třída Uživatelé), určeno pro filtry, které hledají podle těchto dat.
        /// </summary>
        public static new string SqlColumnOsoba { get { return "lcs.noris_user.osoba"; } }
        /// <summary>
        /// Jméno sloupce, který obsahuje login osoby (třída Uživatelé), určeno pro filtry, které hledají podle těchto dat.
        /// </summary>
        public static new string SqlColumnLogin { get { return "lcs.noris_user.login"; } }
        /// <summary>
		/// Generátor SELECTU pro načítání do CACHE.
		/// Vrátí SQL SELECT, který používá SysCache pro automatické načítání záznamů do cache.
		/// Vrácený select má tvar "SELECT * FROM tabulka [join lcs.subjekty] WHERE [master_tabulka.]key_column", cache si doplní číslo[a] záznamů sama.
		/// </summary>
		/// <returns>Vrátí SQL SELECT, který používá SysCache pro automatické načítání záznamů do cache.</returns>
		public override string GetCacheSelect()
		{
			return SqlSelect + " WHERE " + SqlRecord;
		}
		#endregion
	}
	#endregion
    #region CLASS SchedulerConfigCls : Třída odvozená z tabulky lcs.scheduler_config,      rozšířeno o další property !!!
    /// <summary>
    /// SchedulerConfigCls : Data z Master tabulky třídy 1963: Konfigurace modulu Scheduler (SchedulerConfigInst), Nonsubjektová
    /// Data načtena z tabulky lcs.scheduler_config
    /// </summary>
    public partial class SchedulerConfigReadOnlyCls : RecordCls, IDbRecord
    {
        #region KONSTRUKTORY
        /// <summary>
        /// Implicitní konstruktor, zajistí číslování záznamů do jednotné Temporary řady
        /// </summary>
        public SchedulerConfigReadOnlyCls()
            : base()
        { }
        /// <summary>
        /// Konstruktor s načítáním dat z databáze
        /// </summary>
        /// <param name="recordNumber">Číslo záznamu, který je třeba načíst</param>
        public SchedulerConfigReadOnlyCls(int recordNumber)
            : base(recordNumber)
        { }
        /// <summary>
        /// Explicitní konstruktor, dovolí zvolit, zda se pro tento záznam bude generovat Temporary ID
        /// </summary>
        /// <param name="createTemporaryId">true pokud se pro záznam má vytvořit Temporary ID.
        /// Default (false) = nevytvoří se, bude mít RecordNumber = 0.</param>
        public SchedulerConfigReadOnlyCls(bool createTemporaryId)
            : base(createTemporaryId)
        { }
        #endregion
        #region PUBLIC OVERRIDE PROPERTY
        /// <summary>Číslo třídy (1963)</summary>
        public override int ClassNumber { get { return ClassNr; } }
        /// <summary>Číslo třídy (1963)</summary>
        public const int ClassNr = 1963;
        /// <summary>Číslo záznamu = cislo_nonsubjektu</summary>
        public override int RecordNumber { get { return base._cislo_nonsubjektu; } }
        /// <summary>IDbRecord.RecordNumber : musí konkrétně implementovat set, protože DbLayer po uložení nového záznamu (kde RecordNumber == 0) do něj vloží přidělený klíč</summary>
        int IDbRecord.RecordNumber
        {
            get { return this.RecordNumber; }
            set { base._cislo_nonsubjektu = value; }
        }
        #endregion
        #region PUBLIC DATA PROPERTY
        ///<summary><para>Atribut: Typ údaje, podmnožina v rámci Skupiny. Pro skupinu = 1 (Konfigurované texty): 1 = text prvku (Text)  2 = doplňující text (ToolTipText)</para><para>Db: lcs.scheduler_config.typ (int null)</para></summary>
        public SqlInt32 Typ { get { return _typ; } }
        ///<summary><para>Atribut: Klíč údaje. Pro konfigurované texty je zde uložen klíč konkrétního druhu elementů, pro který tato konfigurace platí. Klíč pochází z interface IConfiguredText, z property string ConfigurationKey.</para><para>Db: lcs.scheduler_config.klic (varchar (40) null)</para></summary>
        public string Klic { get { return _klic; } }
        ///<summary><para>Atribut: Skupina údaje. 1 = Konfigurovaný text</para><para>Db: lcs.scheduler_config.skupina (int null)</para></summary>
        public SqlInt32 Skupina { get { return _skupina; } }
        ///<summary><para>Atribut: Název položky</para><para>Db: lcs.scheduler_config.nazev (varchar (40) null)</para></summary>
        public new string Nazev { get { return _nazev; } }
        ///<summary><para>Atribut: Text konfigurace</para><para>Db: lcs.scheduler_config.text (varchar (-1) null)</para></summary>
        public string Text { get { return _text; } }
        #endregion
        #region PROTECTED DATA FIELDS
#pragma warning disable 1591
        protected SqlInt32 _typ;
        protected string _klic;
        protected SqlInt32 _skupina;
        protected string _nazev;
        protected string _text;
#pragma warning restore 1591
        #endregion
        #region FILL FROM READER, SAVE RECORD (void)
        /// <summary>
        /// Virtuální metoda, která umožňuje potomkům provádět typovou a rychlou konverzi dat proudících z databáze přes DataReader 
        /// přímo do objektu této třídy, bez použití generické metody FieldInfo.SetValue (která je poněkud pomalá).
        /// Tato metoda v této třídě tedy má naplnit každou svoji instanční proměnnou (field) hodnotou z předaného SqlDataReaderu.
        /// Pro snadné načtení dat je předán objekt mapper, který nabízí svou generickou metodu FillDataIntoField«int»(string dbColumnName, SqlDataReader reader).
        /// Tato metoda vrátí načtená data (typovaná jako objekt).
        /// Čtení touto metodou je cca 6x rychlejší než čtení generickou metodou.
        /// Metoda má vracet true, pokud převzala všechna data. 
        /// Je nanejvýše účelné, aby tak provedla, protože pokud vrátí false, pak se po jejím skončení provede generické ukládání dat (což je 6x pomalejší).
        /// </summary>
        /// <param name="reader">Vstupní DataReader</param>
        /// <param name="map">Mapování dat z readeru na fields tohoto objektu</param>
        /// <returns>true = data byla převzata / false = data nepřevzata</returns>
        public override bool FillFromReader(SqlDataReader reader, FieldMapperLoad map)
        {
            _cislo_nonsubjektu = (int)map.FillDataIntoField<int>("cislo_nonsubjektu", reader);
            _typ = (SqlInt32)map.FillDataIntoField<SqlInt32>("typ", reader);
            _klic = (string)map.FillDataIntoField<string>("klic", reader);
            _skupina = (SqlInt32)map.FillDataIntoField<SqlInt32>("skupina", reader);
            _nazev = (string)map.FillDataIntoField<string>("nazev", reader);
            _text = (string)map.FillDataIntoField<string>("text", reader);
            return true;
        }
        /// <summary>
        /// Zajistí přípravu svých dat do podkladové vrstvy pro uložení do databáze.
        /// Subjektové třídy musí nejprve volat SubjectCls.PrepareSaveData(this, map);, 
        /// tím se uloží data do tabulky subjektů (a pro nové záznamy se vygeneruje číslo subjektu).
        /// Nonsubjektové třídy to volat nesmí.
        /// </summary>
        /// <param name="map"></param>
        /// <returns></returns>
        public override bool PrepareSaveData(FieldMapperSave map)
        {
            return false;
        }
        #endregion
        #region STATIC GENERÁTORY SELECTU
        /// <summary>
        /// SQL SELECT pro načtení columnů, odpovídajících této struktuře. Pozor: neobsahuje filtr ani order.
        /// </summary>
        public static new string SqlSelect { get { return @"SELECT cislo_nonsubjektu,typ,klic,skupina,nazev,text FROM lcs.scheduler_config"; } }
        /// <summary>
        /// Jméno sloupce, který obsahuje klíč záznamu, určeno pro filtry.
        /// </summary>
        public static new string SqlRecord { get { return "cislo_nonsubjektu"; } }
        /// <summary>
        /// Generátor SELECTU pro načítání do CACHE.
        /// Vrátí SQL SELECT, který používá SysCache pro automatické načítání záznamů do cache.
        /// Vrácený select má tvar "SELECT * FROM tabulka [join lcs.subjekty] WHERE [master_tabulka.]key_column", cache si doplní číslo[a] záznamů sama.
        /// </summary>
        /// <returns>Vrátí SQL SELECT, který používá SysCache pro automatické načítání záznamů do cache.</returns>
        public override string GetCacheSelect()
        {
            return SqlSelect + " WHERE " + SqlRecord;
        }
        #endregion
        #region Rozšířené property nad rámec RecordCls, odlišné overrides
        /// <summary>Reference: roli reference hraje Klic.</summary>
        public override string Reference { get { return _klic; } protected set { _klic = value; IsDirty = true; } }
        // PS : ve standardních public property je ještě změna:      public string Nazev   =>    public override string Nazev
        #endregion
    }
    #endregion
}
